<script setup lang="ts">
import { ref } from 'vue'
import { message } from 'ant-design-vue'
import {
  WalletOutlined,
  CopyOutlined,
  DownloadOutlined,
  WarningOutlined,
  SafetyOutlined,
} from '@ant-design/icons-vue'
import Web3 from 'web3'

const web3 = new Web3()

// 生成的钱包列表
const walletList = ref<any[]>([])
const isGenerating = ref(false)

// 批量生成数量
const batchCount = ref(1)

// 成员信息
const memberInfo = ref({
  name: '',
  generation: 1,
  birthYear: new Date().getFullYear() - 30
})

/**
 * 生成单个钱包
 */
function generateSingleWallet() {
  if (!memberInfo.value.name) {
    message.error('请填写成员姓名')
    return
  }
  
  isGenerating.value = true
  
  try {
    const account = web3.eth.accounts.create()
    
    const wallet = {
      id: Date.now(),
      name: memberInfo.value.name,
      generation: memberInfo.value.generation,
      birthYear: memberInfo.value.birthYear,
      address: account.address,
      privateKey: account.privateKey,
      createdAt: new Date().toLocaleString('zh-CN')
    }
    
    walletList.value.unshift(wallet)
    
    message.success(`钱包生成成功！地址: ${wallet.address}`)
    
    // 重置表单
    memberInfo.value = {
      name: '',
      generation: 1,
      birthYear: new Date().getFullYear() - 30
    }
  } catch (error: any) {
    console.error('❌ 钱包生成失败:', error)
    message.error('钱包生成失败')
  } finally {
    isGenerating.value = false
  }
}

/**
 * 批量生成钱包
 */
function batchGenerateWallets() {
  if (batchCount.value < 1 || batchCount.value > 100) {
    message.error('批量数量应在 1-100 之间')
    return
  }
  
  isGenerating.value = true
  
  try {
    const wallets = []
    
    for (let i = 0; i < batchCount.value; i++) {
      const account = web3.eth.accounts.create()
      
      wallets.push({
        id: Date.now() + i,
        name: `成员 ${i + 1}`,
        generation: 1,
        birthYear: 0,
        address: account.address,
        privateKey: account.privateKey,
        createdAt: new Date().toLocaleString('zh-CN')
      })
    }
    
    walletList.value = [...wallets, ...walletList.value]
    
    message.success(`成功生成 ${batchCount.value} 个钱包！`)
  } catch (error: any) {
    console.error('❌ 批量生成失败:', error)
    message.error('批量生成失败')
  } finally {
    isGenerating.value = false
  }
}

/**
 * 复制地址
 */
function copyAddress(address: string) {
  navigator.clipboard.writeText(address)
  message.success('地址已复制到剪贴板')
}

/**
 * 复制私钥
 */
function copyPrivateKey(privateKey: string) {
  navigator.clipboard.writeText(privateKey)
  message.warning('私钥已复制！请妥善保管，切勿泄露！')
}

/**
 * 导出单个钱包
 */
function exportWallet(wallet: any) {
  const content = `家族成员钱包信息
====================

成员姓名: ${wallet.name}
世代: 第 ${wallet.generation} 代
出生年份: ${wallet.birthYear}

钱包地址: ${wallet.address}
私钥: ${wallet.privateKey}

⚠️ 重要提示：
1. 私钥是恢复钱包的唯一凭证，请务必安全保存
2. 切勿将私钥告诉任何人，包括系统管理员
3. 建议将此文件保存在加密的U盘或密码管理器中
4. 如私钥丢失，钱包中的资产将无法找回

生成时间: ${wallet.createdAt}
`
  
  downloadTextFile(content, `wallet_${wallet.name}_${wallet.address.slice(0, 8)}.txt`)
}

/**
 * 导出所有钱包
 */
function exportAllWallets() {
  if (walletList.value.length === 0) {
    message.warning('没有可导出的钱包')
    return
  }
  
  let content = `家族成员钱包批量导出
====================

总数: ${walletList.value.length}
导出时间: ${new Date().toLocaleString('zh-CN')}

⚠️ 重要提示：此文件包含私钥信息，请务必安全保管！

====================

`
  
  walletList.value.forEach((wallet, index) => {
    content += `
${index + 1}. ${wallet.name}
   世代: 第 ${wallet.generation} 代
   出生: ${wallet.birthYear}
   地址: ${wallet.address}
   私钥: ${wallet.privateKey}
   --------
`
  })
  
  downloadTextFile(content, `family_wallets_${Date.now()}.txt`)
  message.success('所有钱包信息已导出')
}

/**
 * 导出为 CSV（用于 Excel 导入）
 */
function exportAsCSV() {
  if (walletList.value.length === 0) {
    message.warning('没有可导出的钱包')
    return
  }
  
  let csv = 'ID,姓名,世代,出生年份,钱包地址,私钥,创建时间\n'
  
  walletList.value.forEach(wallet => {
    csv += `${wallet.id},"${wallet.name}",${wallet.generation},${wallet.birthYear},"${wallet.address}","${wallet.privateKey}","${wallet.createdAt}"\n`
  })
  
  downloadTextFile(csv, `family_wallets_${Date.now()}.csv`)
  message.success('CSV 文件已导出')
}

/**
 * 下载文本文件
 */
function downloadTextFile(content: string, filename: string) {
  const blob = new Blob([content], { type: 'text/plain;charset=utf-8' })
  const url = URL.createObjectURL(blob)
  const a = document.createElement('a')
  a.href = url
  a.download = filename
  a.click()
  URL.revokeObjectURL(url)
}

/**
 * 清空列表
 */
function clearWallets() {
  if (walletList.value.length === 0) return
  
  if (confirm('确定要清空所有钱包吗？请确保已导出保存！')) {
    walletList.value = []
    message.success('已清空列表')
  }
}

/**
 * 格式化地址
 */
function formatAddress(address: string) {
  return `${address.slice(0, 10)}...${address.slice(-8)}`
}
</script>

<template>
  <div class="wallet-generator">
    <!-- 页面标题 -->
    <div class="page-header">
      <div class="header-content">
        <h2><WalletOutlined /> 钱包生成工具</h2>
        <p>为家族成员生成区块链钱包账户</p>
      </div>
    </div>

    <!-- 安全提示 -->
    <a-alert
      type="warning"
      show-icon
      style="margin-bottom: 24px"
    >
      <template #message>
        <span style="font-weight: 600">⚠️ 安全提示</span>
      </template>
      <template #description>
        <ul style="margin: 8px 0; padding-left: 20px">
          <li>私钥是恢复钱包的<strong>唯一凭证</strong>，丢失后无法找回</li>
          <li>请将生成的钱包信息<strong>导出并安全保存</strong>（加密U盘、密码管理器等）</li>
          <li>切勿将私钥告诉任何人，包括系统管理员</li>
          <li>生成钱包后，请<strong>立即导出</strong>，刷新页面后将无法再次查看</li>
          <li>建议通过<strong>安全方式</strong>将钱包信息交给成员（面对面、加密邮件等）</li>
        </ul>
      </template>
    </a-alert>

    <a-row :gutter="16">
      <!-- 左侧：生成工具 -->
      <a-col :xs="24" :md="10">
        <!-- 单个钱包生成 -->
        <a-card title="生成单个钱包" style="margin-bottom: 16px">
          <a-form layout="vertical">
            <a-form-item label="成员姓名" required>
              <a-input
                v-model:value="memberInfo.name"
                placeholder="请输入成员姓名"
                size="large"
              />
            </a-form-item>
            
            <a-form-item label="世代">
              <a-input-number
                v-model:value="memberInfo.generation"
                :min="0"
                :max="10"
                style="width: 100%"
                size="large"
              />
            </a-form-item>
            
            <a-form-item label="出生年份">
              <a-input-number
                v-model:value="memberInfo.birthYear"
                :min="1900"
                :max="new Date().getFullYear()"
                style="width: 100%"
                size="large"
              />
            </a-form-item>
            
            <a-button
              type="primary"
              block
              size="large"
              :loading="isGenerating"
              @click="generateSingleWallet"
            >
              <WalletOutlined /> 生成钱包
            </a-button>
          </a-form>
        </a-card>

        <!-- 批量生成 -->
        <a-card title="批量生成钱包">
          <a-form layout="vertical">
            <a-form-item label="生成数量" help="一次最多生成100个">
              <a-input-number
                v-model:value="batchCount"
                :min="1"
                :max="100"
                style="width: 100%"
                size="large"
              />
            </a-form-item>
            
            <a-button
              block
              size="large"
              :loading="isGenerating"
              @click="batchGenerateWallets"
            >
              批量生成
            </a-button>
          </a-form>
          
          <a-alert
            type="info"
            message="批量生成后，请为每个成员填写详细信息"
            style="margin-top: 16px"
            show-icon
          />
        </a-card>
      </a-col>

      <!-- 右侧：生成的钱包列表 -->
      <a-col :xs="24" :md="14">
        <a-card>
          <template #title>
            <div style="display: flex; align-items: center; justify-content: space-between">
              <span>已生成钱包 ({{ walletList.length }})</span>
              <a-space>
                <a-button
                  size="small"
                  :disabled="walletList.length === 0"
                  @click="exportAllWallets"
                >
                  <DownloadOutlined /> 导出全部
                </a-button>
                <a-button
                  size="small"
                  :disabled="walletList.length === 0"
                  @click="exportAsCSV"
                >
                  导出 CSV
                </a-button>
                <a-button
                  size="small"
                  danger
                  :disabled="walletList.length === 0"
                  @click="clearWallets"
                >
                  清空
                </a-button>
              </a-space>
            </div>
          </template>
          
          <a-empty v-if="walletList.length === 0" description="还没有生成钱包">
            <a-button type="primary" @click="generateSingleWallet">
              <WalletOutlined /> 生成第一个钱包
            </a-button>
          </a-empty>
          
          <a-list
            v-else
            :data-source="walletList"
            :pagination="{ pageSize: 10 }"
          >
            <template #renderItem="{ item, index }">
              <a-list-item>
                <a-card size="small" style="width: 100%">
                  <template #title>
                    <div style="display: flex; align-items: center; gap: 8px">
                      <a-avatar :style="{ backgroundColor: '#1890ff' }">
                        {{ item.name?.charAt(0) || (index + 1) }}
                      </a-avatar>
                      <span>{{ item.name || `钱包 ${index + 1}` }}</span>
                      <a-tag color="blue" size="small">第 {{ item.generation }} 代</a-tag>
                    </div>
                  </template>
                  
                  <template #extra>
                    <a-button size="small" @click="exportWallet(item)">
                      <DownloadOutlined /> 导出
                    </a-button>
                  </template>
                  
                  <a-descriptions :column="1" size="small">
                    <a-descriptions-item label="钱包地址">
                      <a-typography-text
                        copyable
                        :content="item.address"
                        style="font-size: 12px; font-family: monospace"
                      >
                        {{ formatAddress(item.address) }}
                      </a-typography-text>
                    </a-descriptions-item>
                    
                    <a-descriptions-item label="私钥">
                      <a-input-password
                        :value="item.privateKey"
                        size="small"
                        readonly
                        style="font-size: 11px; font-family: monospace"
                      >
                        <template #suffix>
                          <CopyOutlined
                            style="cursor: pointer"
                            @click="copyPrivateKey(item.privateKey)"
                          />
                        </template>
                      </a-input-password>
                    </a-descriptions-item>
                    
                    <a-descriptions-item label="出生年份">
                      {{ item.birthYear || '-' }}
                    </a-descriptions-item>
                    
                    <a-descriptions-item label="生成时间">
                      {{ item.createdAt }}
                    </a-descriptions-item>
                  </a-descriptions>
                </a-card>
              </a-list-item>
            </template>
          </a-list>
        </a-card>
      </a-col>
    </a-row>

    <!-- 使用说明 -->
    <a-card title="📖 使用说明" style="margin-top: 24px">
      <a-steps direction="vertical" :current="4">
        <a-step title="生成钱包">
          <template #description>
            填写成员信息后，点击"生成钱包"按钮，系统会自动创建新的以太坊钱包账户
          </template>
        </a-step>
        
        <a-step title="保存私钥">
          <template #description>
            <div>
              <SafetyOutlined style="color: #ff4d4f" />
              <strong style="color: #ff4d4f">  立即导出钱包信息并安全保存！</strong><br>
              私钥一旦丢失，钱包中的资产将永久无法找回
            </div>
          </template>
        </a-step>
        
        <a-step title="分发给成员">
          <template #description>
            通过安全方式（面对面、加密邮件等）将钱包信息交给对应成员<br>
            提醒成员导入 MetaMask 并妥善保管私钥
          </template>
        </a-step>
        
        <a-step title="添加到家族">
          <template #description>
            使用生成的钱包地址，在"成员管理"页面添加成员到家族
          </template>
        </a-step>
      </a-steps>
    </a-card>

    <!-- 安全建议 -->
    <a-card title="🔒 安全建议" style="margin-top: 24px">
      <a-row :gutter="16">
        <a-col :xs="24" :md="12">
          <h4>✅ 应该做的：</h4>
          <ul>
            <li>立即导出钱包信息到本地</li>
            <li>使用加密 U 盘或密码管理器保存</li>
            <li>通过安全方式分发给成员</li>
            <li>提醒成员备份私钥</li>
            <li>定期检查钱包安全</li>
            <li>使用硬件钱包存储大额资产</li>
          </ul>
        </a-col>
        
        <a-col :xs="24" :md="12">
          <h4>❌ 不要做的：</h4>
          <ul>
            <li>不要在线保存私钥</li>
            <li>不要通过微信/QQ发送私钥</li>
            <li>不要截图保存私钥</li>
            <li>不要在公共电脑上生成钱包</li>
            <li>不要将私钥告诉陌生人</li>
            <li>不要忽略安全警告</li>
          </ul>
        </a-col>
      </a-row>
    </a-card>
  </div>
</template>

<style scoped lang="scss">
.wallet-generator {
  .page-header {
    padding: 24px;
    margin-bottom: 24px;
    background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
    border-radius: 12px;
    color: white;
    
    .header-content {
      h2 {
        margin: 0 0 8px;
        font-size: 28px;
        color: white;
      }
      
      p {
        margin: 0;
        font-size: 14px;
        opacity: 0.9;
      }
    }
  }
  
  :deep(.ant-card) {
    margin-bottom: 16px;
  }
  
  :deep(.ant-descriptions-item-label) {
    font-weight: 500;
  }
  
  :deep(.ant-steps-item-description) {
    font-size: 13px;
  }
}
</style>
